// 导入axios
import Vue from 'vue'
import axios from 'axios'
import VueAxios from 'vue-axios'

Vue.use(VueAxios, axios)

// 1.创建instance
const instance = axios.create({
  baseURL: 'http://toutiao.itheima.net',
  timeout: 10000
})

// 导入token.js
import { getToken, saveToken } from './token.js'
import { Toast } from 'vant'
// 导入路由router(这个文件导入的router就是vue原型中的$router)
import router from '@/router/index.js'

/* 添加请求拦截器 ：给项目添加默认token  */
instance.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    /* 应用场景：添加默认请求参数 或 默认请求头(如token) */
    // 不知道用于有没有登录，有登录才传token
    if (getToken()) {
      config.headers.Authorization = `Bearer ${getToken().token}`
    }
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

/* 添加响应拦截器：处理401token刷新问题 */
instance.interceptors.response.use(
  function (response) {
    //对响应数据做点什么
    return response
  },
   async function (error) {
    // 对响应数据做点什么
    // 场景：拦截服务器一些错误状态码 如果401

     //1.判断状态码是不是401
    if(error.response && error.response.status == 401){
      // 是401
      //2.判断是有没有token
      if(getToken()){
        //2.1 有token,说明token过期了，处理方式刷新token
        /* 这个地方不能使用instance发请求
           原因：
           (1)这个刷新接口的参数需要refresh_token，而不是token
           (2)instance默认会在请求拦截发送token。(token已经是过期的用不了)
           解决：使用axios来发送请求
            axios没有添加拦截器，不会默认添加token
            axios没有基地址，需要写全地址

        */
        try{

          let res = await axios({
            url:'http://toutiao.itheima.net/v1_0/authorizations',
            method:'put',
            headers:{
              Authorization:`Bearer ${getToken().refresh_token}`
            }
          })
          console.log(res);

          //服务器返回新的token，更新localStorage中的token
          saveToken({
            token:res.data.data.token,
            refresh_token:getToken().refresh_token
          })
          //重新发送用户之前的请求
          return instance(error.config)
        }catch(err){
          //refresh_token也过期
          //跳转登录页
          Toast.fail('请登录')
          router.push('/login')
        }
      }else{
        //2.2 没有token，用户没有登录 跳转登录页
        Toast.fail('请登录')
        router.push('/login')
      }
    }else{
      //不是401，错误与token无关，不做任何处理
    }
    return Promise.reject(error)
  }
)

// 导出接口
export default instance
